import javax.crypto.spec.PSource;

/**
 * Created with IntelliJ IDEA
 * Description
 * Data: 2025-10-11
 */
public class Test {
    /**
     * 字面常量：不论程序何时运行，输出的都是一个数据就是字面常量，例如下方的输出。
     * 常量即程序运行期间，固定不变的称为常量
     */
    public static void main0(String[] args) {
        System.out.println("hello world");
        System.out.println(100);
        System.out.println(3.14);
        System.out.println('A');
        System.out.println(true);
        System.out.println(false);
    }


    /**
     * 基本数据类型:整型和浮点型都是带有符号的，在java当中没有无符号，其中整型默认int类型，浮点型默认double类型
     *            1、byte 字节型：1个字节
     *            2、short短整型：2个字节
     *            3、int 整型：4个字节，不管是在16位系统还是32位系统，int都占用4个字节，long占8个字节
     *            4、long 长整型：8个字节
     *            5、float 单精度浮点型：4个字节
     *            6、double 单精度浮点型：8个字节
     *            7、char 字符型：2个字节
     *            8、boolean 布尔型
     */


    //定义变量方式1：在定义变量的时候顺便赋值
    public static void main1(String[] args) {
        int a = 10;
        System.out.println(a);
    }

    //定义变量方式2：在定义变量的时候不进行赋值，在使用该变量前进行赋值，如果该变量在使用前都没有进行赋值就会进行报错，提示可能未进行初始化变量
    public static void main2(String[] args) {
        int a;
        a = 20;
        System.out.println(a);
    }

    //整型变量的最大值和最小值
    public static void main3(String[] args) {
        System.out.println(Integer.MAX_VALUE);
        System.out.println(Integer.MIN_VALUE);
    }

    //全局变量的局部变量的一个区别
    public static int H;
    public static void main4(String[] args) {
        System.out.println(H);   //输出0，全局变量在未进行赋值的时候默认为0
        int b;
        //System.out.println(b);  //报错，局部变量在使用的时候必须进行初始化
    }

    //在java中，int除以int的值仍然是int（会直接舍弃小数部分）。如果想要得到0.5，需要使用double类型计算
    public static void main5(String[] args) {
        int a = 1;
        int b = 2;
        System.out.println(a / b); //输出0
        double c = 2.0;
        System.out.println(a / c); //输出0.5
    }

    //float单精度浮点型
    public static void main6(String[] args) {
        //float a = 1.5; //这是错误的写法，在java当中1.5默认是双精度浮点型，占8个字节，float是单精度浮点型占4个字节，所以超过了位数
        float a = 1.5f; //正确写法
    }

    public static void main7(String[] args) {
        char ch = 'a';
        char ch2 = 97;
        System.out.println(ch);
        System.out.println(ch2);
        char ch3 = '郝';  //一个汉字占两个字节
        System.out.println(ch3);
        System.out.println(Character.MAX_VALUE);
        System.out.println(Character.MIN_VALUE);
    }


    //java当中，boolean只有两种取值，true和false，不存在0是假，非0为真的说法
    //JVM没有规范bolean的大小
    public static void main8(String[] args) {
        boolean flg = true;
        System.out.println(flg);
    }

    //java作为一个强类型编程语言，当不同类型之间的变量相互赋值的时候，会有严格的校验
    public static void main9(String[] args) {
        int a = 10;
        long b = 20L;
        b = a;   //可以通过编译，因为int是4个字节，long是8个字节，8个字节可以存储4个字节的内容
        //a = b;  //通过不了编译，a是int类型占四个字节，b是long类型占8个字节，4个字节的内容存储不了8个字节的内容，所以无法编译
    }


    /**
     * 自动类型转换（隐式）：代码不需要经过任何处理，在代码编译的时候，编译器会自动进行处理。
     * 特点：数据范围小的转换为数据范围大的时候会自动进行
     */
    public static void main10(String[] args) {
        int a = 100;
        long b = 10L;
        b = a; //int类型的值自动转换成了long类型
    }

    /**
     * 强制类型转换：当进行操作时，代码需要经过一定的格式处理，不能自动完成。
     * 特点：数据范围大的像数据类型范围小的进行转换
     */
    public static void main11(String[] args) {
        int a = 100;
        long b = 10L;
        a = (int)b; //将long类型强制类型转换成int类型，可能会造成数据丢失

        byte b1 = 100; //在这里100是整型，但是这个是字面值常量，将一个字面值常量进行赋值的时候，java会自动针对数字范围进行检查，100没有超出byte范围，隐式转换
    }

    /**
     * 类型提升小结：
     * 1、不同类型的数据混合运算，范围小的会提升成范围大的
     * 2、对于short，byte这种比4个字节小的类型，会提升为4个字节的int在进行运算
     */
    public static void main12(String[] args) {
        int x = 10;
        long y = 20L;
        //int z = x + y; //编译错误，x会提升为long类型进行计算，最后得到的数据类型是long，long赋值给int类型超出范围导致报错
        int z = (int)(x + y);
        System.out.println(z);

        //以下为2
        byte a = 10;
        byte b = 20;
        //byte c = a + b; //编译错误
        byte c = (byte) (a + b);
        System.out.println(c);
    }


    //字符串类型
    public static void main13(String[] args) {
        String str1 = "hello";
        System.out.println("str1: "  + str1);

        String str2 = "world";
        System.out.println("str2: "  + str2);

        String str3 = str1 + " " + str2;  //拼接字符串
        System.out.println("str3: "  + str3);
    }

    //把int转换成string
    public static void main14(String[] args) {
        int a = 10;
        //方法1
        String str1 = a + "";
        System.out.println(str1);

        //方法2
        String str2 = String.valueOf(a);
        System.out.println(str2);
    }

    //将string类型转换成int类型
    public static void main(String[] args) {
        String str = "100";
        int num = Integer.parseInt(str);
        System.out.println(num);

        String str2 = "12.54";
        double num2 = Double.parseDouble(str2);
        System.out.println(str2);
    }
}
